#!/bin/bash
#
# 文 件 名: install_dm_database.sh.sh
# 文件编码: UTF-8
# 编程工具: VSCode、Notepad++
# 显示语言: 简体中文
# 脚本编写：乔亚博
# 联系邮箱: 1517312393@qq.com
# 问题反馈: 13718064870
# 微信反馈：VIPqiaoYB
#
#
#
#-------------------- 数据库用户配置 --------------------------------
dmuser=dmdba
dmgroup=dinstall
dmuserpasswd=ajlfhwaifhapw019821..
#=============== 用户配置区域 (直接修改这里的变量即可) ===============
# 必填 - DM安装包路径
dmsoft=/root/dm8_20250122_x86_rh7_64.zip
# 必填 - DM安装目录
dmbasedir=/data/dmserver/app
# 必填 - DM数据目录
dmdatadir=/data/dmserver/data
# 必填 - 上传后的DM静默文件安装位置
jmaz=/root/jmaz.xml
#
#-------------------- 系统安全配置 ----------------------------------
FIREWALL_ACTION=1  # 1=关闭防火墙，0=不操作防火墙（保持默认）
SELINUX_ACTION=1   # 1=关闭SELinux，0=不操作SElinux（保持默认）
#
#-------------------- jmaz.xml 静默安装配置 ------------------------
# 数据库核心配置
XML_DB_NAME="DAMENG"                  # 数据库名
XML_INSTANCE_NAME="DMSERVER"          # 实例名
XML_PORT_NUM="5236"                   # 数据库端口
XML_SYSDBA_PWD="Passw0rd@DM"          # SYSDBA密码（需包含大小写字母和数字）
XML_SYSAUDITOR_PWD="Passw0rd@DM"      # SYSAUDITOR密码（需包含大小写字母和数字）
XML_BLANK_PAD_MODE="0"                # 设置空格填充模式，取值范围：0，1，缺省为0 
XML_CASE_SENSITIVE="n"                # 大小写敏感 (y/n)
XML_CHARSET="1"                       # 字符集 (0=GB18030, 1=UTF-8, 2代表韩文字符集EUC-KR)
XML_PAGE_SIZE="32"                    # 页大小 (4/8/16/32)
XML_EXTENT_SIZE="32"                  # 簇大小 (16/32/64)
XML_LOG_SIZE="2048"                   # 日志文件大小(MB)
XML_KEY="/root/license_39890_0.dat"   # 非必填 - 授权文件位置，不要放压缩名 没有授权文件填写示例：XML_KEY=""
#
#
#
#定义DM安装包解压目录
dmsoftware=/dmsoftware
#DM镜像挂载的目录
cdrom=/mnt/cdrom
#
#
#
#-------------------- 系统优化 --------------------------------------
#配置DM用户不限制最大文件打开数量
limits="
${dmuser}  soft      nice       0
${dmuser}  hard      nice       0
${dmuser}  soft      as         unlimited
${dmuser}  hard      as         unlimited
${dmuser}  soft      fsize      unlimited
${dmuser}  hard      fsize      unlimited
${dmuser}  soft      nproc      65536
${dmuser}  hard      nproc      65536
${dmuser}  soft      nofile     65536
${dmuser}  hard      nofile     65536
${dmuser}  soft      core       unlimited
${dmuser}  hard      core       unlimited
${dmuser}  soft      data       unlimited
${dmuser}  hard      data       unlimited
"

# 定义要检查和添加的配置项（/etc/systemd/system.conf）
config="
DefaultLimitCORE=infinity
DefaultLimitNOFILE=100000
DefaultLimitNPROC=100000
DefaultTasksMax=infinity
"

#--------------------以下是代码，非必要勿动！！！-------------------------------
# 判断是否root身份执行。必须使用 root 权限运行当前脚本
if [ "$(id -un)" != "root" ]; then echo -e "\033[31m[错误]\033[0m 需要使用 root 权限运行脚本" && exit; fi

#DM安装包解压需要unzip命令，这里提前检查下  如果没有则安装上
if command -v unzip &> /dev/null; then
    echo -e "\033[33m[信息]\033[0m 环境检查----------检查unzip是否已安装！----------"
    echo -e "\033[32m[成功]\033[0m 环境检查----------unzip已安装，跳过安装步骤----------"
else
    echo -e "\033[33m[信息]\033[0m 环境检查----------未检测到unzip，正在安装..----------"
    
    # 静默安装（隐藏所有输出），只显示结果
    if yum -y install unzip > /dev/null 2>&1; then
        echo -e "\033[32m[成功]\033[0m unzip安装成功"
    else
        echo -e "\033[31m[错误]\033[0m unzip安装失败，请检查错误信息：" >&2
        # 重新运行并捕获错误输出
        yum -y install unzip 2> /tmp/unzip_install_error.log
        cat /tmp/unzip_install_error.log >&2
        rm -f /tmp/unzip_install_error.log
        exit 1
    fi
fi

#判断$dmgroup组是否存在，存在创建，反之不建
if getent group "$dmgroup" &>/dev/null; then
    echo -e "\033[33m[信息]\033[0m 组 $dmgroup 已存在，无需创建"
else
    echo -e "\033[33m[信息]\033[0m "$dmgroup"组不存在，正在创建"
    sleep 2
    groupadd $dmgroup
    echo -e "\033[32m[成功]\033[0m 组 $dmgroup 已创建完成"
fi
#判断$dmuser用户是否存在，存在创建，反之不建
if id $dmuser &>/dev/null; then
    echo -e "\033[33m[信息]\033[0m 用户 $dmuser 已存在，无需创建"
else
    echo -e "\033[33m[信息]\033[0m "$dmuser"用户不存在，正在创建......"
    sleep 2
    if useradd -g "$dmgroup" -m -d "/home/$dmuser" -s /bin/bash "$dmuser"; then
        echo -e "\033[32m[成功]\033[0m 用户 $dmuser 创建成功！"
    else
        echo -e "\033[31m[错误]\033[0m 用户 $dmuser 创建失败！" >&2
        exit 1
    fi
    echo -e "\033[33m[信息]\033[0m 正在设置用户"$dmuser"的密码为:"$dmuserpasswd""
    sleep 2
    echo $dmuserpasswd | passwd --stdin $dmuser &>/dev/null
    echo -e "\033[32m[成功]\033[0m "$dmuser"用户已创建，属组为"$dmgroup"，家目录为/home/$dmuser，密码为："$dmuserpasswd""
fi
#判断数据库软件目录是否存在，存在创建，反之不建
if [ ! -d "$dmbasedir" ]; then
    echo -e "\033[33m[信息]\033[0m 正在创建“$dmbasedir”目录"
    mkdir -p $dmbasedir
    sleep 2
    echo -e "\033[32m[成功]\033[0m “$dmbasedir”目录已创建完成，正在将属主、属组更改为"$dmuser"、"$dmgroup""
    chown -R $dmuser:$dmgroup  $dmbasedir
    sleep 2
    echo -e "\033[32m[成功]\033[0m "$dmbasedir"目录的属主、属组已更改为"$dmuser"、"$dmgroup""
else
    echo -e "\033[33m[信息]\033[0m "$dmbasedir"目录已存在，跳过创建"
fi
#判断数据库数据目录是否存在，存在创建，反之不建
if [ ! -d "$dmdatadir" ]; then
    echo -e "\033[33m[信息]\033[0m 正在创建“$dmdatadir"
    mkdir -p $dmdatadir
    sleep 2
    echo -e "\033[32m[成功]\033[0m “$dmdatadir”目录已创建完成，正在将属主、属组更改为"$dmuser"、"$dmgroup""
    chown -R $dmuser:$dmgroup  $dmdatadir
    sleep 2
    echo -e "\033[32m[成功]\033[0m "$dmdatadir"目录的属主、属组已更改为"$dmuser"、"$dmgroup""
else
    echo -e "\033[33m[信息]\033[0m "$dmdatadir"目录已存在，跳过创建"
fi

# 函数：检查并关闭防火墙
disable_firewalld() {
    # 检查 firewalld 是否安装
    if ! rpm -q firewalld &>/dev/null; then
        echo -e "\033[33m[信息]\033[0m firewalld 未安装，无需操作"
        return 0
    fi

    # 检查防火墙状态
    if systemctl is-active firewalld &>/dev/null; then
        echo -e "\033[33m[操作]\033[0m 停止 firewalld 服务..."
        if systemctl stop firewalld; then
            echo -e "\033[32m[成功]\033[0m firewalld 已停止"
        else
            echo -e "\033[31m[错误]\033[0m 停止 firewalld 失败"  >&2
            return 1
        fi
    else
        echo -e "\033[33m[信息]\033[0m firewalld 已停止"
    fi

    # 禁用开机启动
    if systemctl is-enabled firewalld &>/dev/null; then
        echo -e "\033[33m[操作]\033[0m 禁用 firewalld 开机启动..."
        if systemctl disable firewalld; then
            echo -e "\033[32m[成功]\033[0m firewalld 开机启动已禁用"
        else
            echo -e "\033[31m[错误]\033[0m 禁用 firewalld 开机启动失败"  >&2
            return 1
        fi
    else
        echo -e "\033[32m[成功]\033[0m firewalld 开机启动已禁用"
    fi
}

# 函数：检查并关闭 SELinux
disable_selinux() {
    # 检查 SELinux 状态
    local current_status    #定义一个局部变量。
    current_status=$(getenforce 2>/dev/null)   #将getenforce 2的值传递到current_status局部变量中
    
    # 如果 getenforce 命令不可用
    if [ $? -ne 0 ]; then
        echo -e "\033[32m[信息]\033[0m SELinux 未安装或未启用"
        return 0
    fi

    # 临时关闭 SELinux（如果当前是 Enforcing 模式）
    if [ "$current_status" = "Enforcing" ]; then
        echo -e "\033[33m[操作]\033[0m 临时关闭 SELinux..."
        if setenforce 0; then
            echo "\033[32m[成功]\033[0m SELinux 已临时关闭（Permissive 模式）"
        else
            echo -e "\033[31m[错误]\033[0m SELinux 临时关闭失败"  >&2
            return 1
        fi
    fi

    # 永久关闭 SELinux（修改配置文件）
    local config_file="/etc/selinux/config"
    if [ -f "$config_file" ]; then
        # 检查是否已经禁用
        if grep -q "^SELINUX=disabled" "$config_file"; then
            echo -e "\033[33m[信息]\033[0m SELinux 已配置为永久禁用"
        else
            echo -e "\033[33m[操作]\033[0m 永久禁用 SELinux...."
            # 备份原始文件
            cp -p "$config_file" "${config_file}.bak"
            
            # 修改配置
            if sed -i 's/^SELINUX=.*/SELINUX=disabled/' "$config_file"; then
                echo -e "\033[32m[成功]\033[0m SELinux 已配置为永久禁用"
            else
                echo -e "\033[31m[错误]\033[0m 修改 SELinux 配置文件失败"  >&2
                # 恢复备份
                mv -f "${config_file}.bak" "$config_file"
                return 1
            fi
        fi
    else
        echo -e "\033[33m[信息]\033[0m SELinux 配置文件不存在: $config_file" >&2
    fi
}


#判断是否关闭防火墙等操作，执行disable_firewalld函数
if [[ -n "$FIREWALL_ACTION" && "$FIREWALL_ACTION" -eq 1 ]]; then
    disable_firewalld
else
    echo -e "\033[33m[信息]\033[0m 不操作防火墙"
fi

#判断是否关闭selinux，执行disable_selinux函数
if [[ -n "$SELINUX_ACTION" && "$SELINUX_ACTION" -eq 1 ]]; then
    disable_selinux
else
    echo -e "\033[33m[信息]\033[0m 不操作selinux"
fi




# 检查配置是否已经存在
if ! grep -q "$dmuser" /etc/security/limits.conf; then
    # 如果不存在，则追加配置到文件末尾
    echo "$limits" >> /etc/security/limits.conf
    echo -e "\033[32m[成功]\033[0m 资源无限制配置已配置到 /etc/security/limits.conf"
else
    echo -e "\033[33m[信息]\033[0m limits.conf配置已存在，无需重复写入"
fi





# 跟踪是否已找到所有所需的配置项
all_found=true

# 函数检查配置项是否存在于文件中
check_and_add_config() {
    local key="$1"
    local value="$2"
    if ! grep -q "^$key=$value" /etc/systemd/system.conf; then
        echo "$key=$value" >> /etc/systemd/system.conf
        echo -e "\033[32m[成功]\033[0m $key=$value 已添加配置:/etc/systemd/system.conf"
        all_found=false
    else
        echo -e "\033[33m[信息]\033[0m /etc/systemd/system.conf配置已存在: $key=$value"
    fi
}

# 遍历配置项，检查并添加如有必要
while read -r line; do
    # 跳过空行
    [[ -z "$line" ]] && continue
    key="${line%%=*}"
    value="${line#*=}"
    check_and_add_config "$key" "$value"
done <<< "$config"

if $all_found; then
    echo -e "\033[33m[信息]\033[0m /etc/systemd/system.conf所有配置项均已存在，无需修改。"
fi

# 首先判断DM安装包文件是否存在
if [[ ! -f "$dmsoft" ]]; then
    echo -e "\033[31m[错误]\033[0m 找不到安装包: $dmsoft" 
    exit 1
fi

# 确保目标目录存在
if [[ ! -d "$dmsoftware" ]]; then
    echo -e "\033[32m[创建目录]\033[0m $dmsoftware"
    mkdir -p "$dmsoftware"
fi

# 检查目录是否为空
if [ -z "$(ls -A "$dmsoftware")" ]; then
    echo -e "\033[32m[正在解压安装包]\033[0m"
    
    # 根据文件扩展名选择解压方式
    case "$dmsoft" in
        *.zip)
            if ! unzip -q "$dmsoft" -d "$dmsoftware"; then
                echo -e "\033[31m[错误]\033[0m ZIP解压失败" >&2
                exit 1
			else
				echo -e "\033[32m[解压完成]\033[0m"
				#判断/mnt/cdrom目录是否存在
				if [[ ! -d "$cdrom" ]]; then
					#创建/mnt/cdrom
					mkdir -p $cdrom
					#通过命令查找ios镜像文件名
					dmsoftwareiso=$(find $dmsoftware/*.iso)
						#判断dmsoftwareiso变量是否为空
						if [[ ! -f "$dmsoftwareiso" ]]; then
						echo -e "\033[31m[错误]\033[0m 找不到ISO镜像文件: $dmsoftware/*.iso" 
						exit 1
						fi
					#将iso镜像文件挂载到$cdrom目录中
					mount -o loop $dmsoftwareiso $cdrom
					echo -e "\033[32m[成功]\033[0m 已将"$dmsoftwareiso"文件挂载到"$cdrom"目录中"
				else
					dmbin=`find "$cdrom"/*.bin`
					if [[ ! -f "$dmbin" ]]; then
						echo -e "\033[31m[错误]\033[0m "$dmbin"文件不存在，但"$cdrom"目录存在，请检查" 
						exit 1
					else
						echo -e "\033[32m[成功]\033[0m "$dmbin"文件已在"$cdrom"目录中，所以判断无需重复挂载"
					fi  
				fi
            fi
            ;;
        *.tar)
            if ! tar -xf "$dmsoft" -C "$dmsoftware"; then
                echo -e "\033[31m[错误]\033[0m TAR解压失败" >&2
                exit 1
			else
				echo -e "\033[32m[解压完成]\033[0m"
				#判断/mnt/cdrom目录是否存在
				if [[ ! -d "$cdrom" ]]; then
					#创建/mnt/cdrom
					mkdir -p $cdrom
					#通过命令查找ios镜像文件名
					dmsoftwareiso=$(find $dmsoftware/*.iso)
						#判断dmsoftwareiso变量是否为空
						if [[ ! -f "$dmsoftwareiso" ]]; then
						echo -e "\033[31m[错误]\033[0m 找不到ISO镜像文件: $dmsoftware/*.iso" 
						exit 1
						fi
					#将iso镜像文件挂载到$cdrom目录中
					mount -o loop $dmsoftwareiso $cdrom
					echo -e "\033[32m[成功]\033[0m 已将"$dmsoftwareiso"文件挂载到"$cdrom"目录中"
				else
					dmbin=`find "$cdrom"/*.bin`
					if [[ ! -f "$dmbin" ]]; then
						echo -e "\033[31m[错误]\033[0m "$dmbin"文件不存在，但"$cdrom"目录存在，请检查" 
						exit 1
					else
						echo -e "\033[32m[成功]\033[0m "$dmbin"文件已在"$cdrom"目录中，所以判断无需重复挂载"
					fi  
				fi
            fi
            ;;
        *.tar.gz|*.tgz)
            if ! tar -xzf "$dmsoft" -C "$dmsoftware"; then
                echo -e "\033[31m[错误]\033[0m TAR.GZ解压失败" >&2
                exit 1
			else
				echo -e "\033[32m[解压完成]\033[0m"
				#判断/mnt/cdrom目录是否存在
				if [[ ! -d "$cdrom" ]]; then
					#创建/mnt/cdrom
					mkdir -p $cdrom
					#通过命令查找ios镜像文件名
					dmsoftwareiso=$(find $dmsoftware/*.iso)
						#判断dmsoftwareiso变量是否为空
						if [[ ! -f "$dmsoftwareiso" ]]; then
						echo -e "\033[31m[错误]\033[0m 找不到ISO镜像文件: $dmsoftware/*.iso" 
						exit 1
						fi
					#将iso镜像文件挂载到$cdrom目录中
					mount -o loop $dmsoftwareiso $cdrom
					echo -e "\033[32m[成功]\033[0m 已将"$dmsoftwareiso"文件挂载到"$cdrom"目录中"
				else
					dmbin=`find "$cdrom"/*.bin`
					if [[ ! -f "$dmbin" ]]; then
						echo -e "\033[31m[错误]\033[0m "$dmbin"文件不存在，但"$cdrom"目录存在，请检查" 
						exit 1
					else
						echo -e "\033[32m[成功]\033[0m "$dmbin"文件已在"$cdrom"目录中，所以判断无需重复挂载"
					fi  
				fi
            fi
            ;;
        *.tar.bz2|*.tbz2)
            if ! tar -xjf "$dmsoft" -C "$dmsoftware"; then
                echo -e "\033[31m[错误]\033[0m TAR.BZ2解压失败" >&2
                exit 1
			else
				echo -e "\033[32m[解压完成]\033[0m"
				#判断/mnt/cdrom目录是否存在
				if [[ ! -d "$cdrom" ]]; then
					#创建/mnt/cdrom
					mkdir -p $cdrom
					#通过命令查找ios镜像文件名
					dmsoftwareiso=$(find $dmsoftware/*.iso)
						#判断dmsoftwareiso变量是否为空
						if [[ ! -f "$dmsoftwareiso" ]]; then
						echo -e "\033[31m[错误]\033[0m 找不到ISO镜像文件: $dmsoftware/*.iso" 
						exit 1
						fi
					#将iso镜像文件挂载到$cdrom目录中
					mount -o loop $dmsoftwareiso $cdrom
					echo -e "\033[32m[成功]\033[0m 已将"$dmsoftwareiso"文件挂载到"$cdrom"目录中"
				else
					dmbin=`find "$cdrom"/*.bin`
					if [[ ! -f "$dmbin" ]]; then
						echo -e "\033[31m[错误]\033[0m "$dmbin"文件不存在，但"$cdrom"目录存在，请检查" 
						exit 1
					else
						echo -e "\033[32m[成功]\033[0m "$dmbin"文件已在"$cdrom"目录中，所以判断无需重复挂载"
					fi  
				fi
            fi
            ;;
        *.iso)
			#判断/mnt/cdrom目录是否存在
			if [[ ! -d "$cdrom" ]]; then
				#创建/mnt/cdrom
				mkdir -p $cdrom
				#将iso镜像文件挂载到$cdrom目录中
				mount -o loop $dmsoft $cdrom
				echo -e "\033[32m[成功]\033[0m 已将"$dmsoft"文件挂载到"$cdrom"目录中"
			else
				dmbin=`find "$cdrom"/*.bin`
				if [[ ! -f "$dmbin" ]]; then
					echo -e "\033[31m[错误]\033[0m "$dmbin"文件不存在，但"$cdrom"目录存在，请检查" 
					exit 1
				else
					echo -e "\033[32m[成功]\033[0m "$dmbin"文件已在"$cdrom"目录中，所以判断无需重复挂载"
				fi  
			fi
            ;;
        *)
            echo -e "\033[31m[错误]\033[0m 不支持的压缩格式: $dmsoft" >&2
            exit 1
            ;;
    esac
    echo -e "\033[32m[解压完成]\033[0m"
else
    echo -e "\033[33m[信息]\033[0m 目录已存在且非空: $dmsoftware"
fi




# DM静默安装文件剪切后的位置
JMZ="/home/$dmuser/jmaz.xml"
#设置key的文件路径变量，然后通过sed命令输出给DM静态安装文件里面
dmkey="/home/"$dmuser"/dm.key"

#判断静默安装文件在哪里，根据对应位置来解决
if [[ ! -f "$jmaz" ]]; then
    echo -e "\033[31m[错误]\033[0m 找不到: "$jmaz"文件，准备将"$JMZ"文件还原，需要先判断DM是否已经安装过"
    if [ -n "$(ls -A "$dmbasedir" 2>/dev/null)" ]; then
        echo -e "\033[31m[错误]\033[0m 判断"$dmbasedir"目录不为空，不将迁移后的静默安装配置文件还原到原位置！请检查环境" 
        exit 1
    else
        #可能之前装过，但是没装成功。通过上面的判断可以得出，之前配置文件可能已转移到JMZ变量的值中，增加判断是否已经转移到$JMZ路径中
        echo -e "\033[32m[信息]\033[0m 文件已在"$JMZ",不进行重复剪切文件"
		# 设置配置文件权限
		chown $dmuser:$dmgroup $JMZ
		chmod 755 $JMZ
    fi
else
    mv "$jmaz" "$JMZ"
    echo -e "\033[32m[成功]\033[0m 已将DM静默安装配置文件转移到"$JMZ""
	# 设置配置文件权限
	chown $dmuser:$dmgroup $JMZ
	chmod 755 $JMZ
fi

# 判断key变量是否有值
if [[ -n "$XML_KEY" ]]; then
    # XML_KEY 有值的情况
    echo -e "\033[32m[信息]\033[0m 检测到脚本中已设置key文件路径。检查文件是否存在"
    #判断key文件是否存在
	if [[ ! -f "$XML_KEY" ]]; then
		echo -e "\033[31m[错误]\033[0m 找不到: "$XML_KEY"文件，正在先判断DM是否已经安装过或者脚本已经执行过"
		if [ -n "$(ls -A "$dmbasedir" 2>/dev/null)" ]; then
			echo -e "\033[31m[错误]\033[0m 判断"$dmbasedir"目录不为空，不将迁移后的静默安装配置文件还原到原位置！请检查环境" 
			exit 1
		else
			#可能之前装过，但是没装成功。通过上面的判断可以得出，之前key可能已转移到dmkey变量的值中，增加判断是否已经转移到$dmkey路径中
			if [[ ! -f "$dmkey" ]]; then
				echo -e "\033[31m[错误]\033[0m 找不到: "$dmkey"文件，没转移到"$dmkey"过"
				exit 1
			else
				#可能之前装过，但是没装成功。通过上面的判断可以得出，之前key已转移到dmkey变量的值中	
				echo -e "\033[32m[信息]\033[0m 文件已在"$dmkey"中，不进行重复剪切文件"
				chown $dmuser:$dmgroup $dmkey
				chmod 755 $dmkey
			fi
		fi
	else
		mv "$XML_KEY" "$dmkey"
		echo -e "\033[32m[成功]\033[0m key文件存在！已将DM授权文件文件转移到"$dmkey""
		chown $dmuser:$dmgroup $dmkey
		chmod 755 $dmkey
	fi
else
    # XML_KEY 为空的情况
    echo -e "\033[33m[信息]\033[0m 未指定授权文件路径，将配置置空"
    sed -i -e "s|<KEY>.*</KEY>|<KEY></KEY>|" "$JMZ"
    echo -e "\033[32m[成功]\033[0m 已清除配置文件中的授权KEY"
fi







# 使用sed动态替换配置
sed -i -e "s|<INSTALL_PATH>.*</INSTALL_PATH>|<INSTALL_PATH>$dmbasedir</INSTALL_PATH>|" $JMZ
sed -i -e "s|<PATH>.*</PATH>|<PATH>$dmdatadir</PATH>|" $JMZ
sed -i -e "s|<DB_NAME>.*</DB_NAME>|<DB_NAME>$XML_DB_NAME</DB_NAME>|" $JMZ
sed -i -e "s|<INSTANCE_NAME>.*</INSTANCE_NAME>|<INSTANCE_NAME>$XML_INSTANCE_NAME</INSTANCE_NAME>|" $JMZ
sed -i -e "s|<PORT_NUM>.*</PORT_NUM>|<PORT_NUM>$XML_PORT_NUM</PORT_NUM>|" $JMZ
sed -i -e "s|<SYSDBA_PWD>.*</SYSDBA_PWD>|<SYSDBA_PWD>$XML_SYSDBA_PWD</SYSDBA_PWD>|" $JMZ
sed -i -e "s|<SYSAUDITOR_PWD>.*</SYSAUDITOR_PWD>|<SYSAUDITOR_PWD>$XML_SYSAUDITOR_PWD</SYSAUDITOR_PWD>|" $JMZ
sed -i -e "s|<BLANK_PAD_MODE>.*</BLANK_PAD_MODE>|<BLANK_PAD_MODE>$XML_BLANK_PAD_MODE</BLANK_PAD_MODE>|" $JMZ
sed -i -e "s|<CASE_SENSITIVE>.*</CASE_SENSITIVE>|<CASE_SENSITIVE>$XML_CASE_SENSITIVE</CASE_SENSITIVE>|" $JMZ
sed -i -e "s|<CHARSET>.*</CHARSET>|<CHARSET>$XML_CHARSET</CHARSET>|" $JMZ
sed -i -e "s|<PAGE_SIZE>.*</PAGE_SIZE>|<PAGE_SIZE>$XML_PAGE_SIZE</PAGE_SIZE>|" $JMZ
sed -i -e "s|<EXTENT_SIZE>.*</EXTENT_SIZE>|<EXTENT_SIZE>$XML_EXTENT_SIZE</EXTENT_SIZE>|" $JMZ
sed -i -e "s|<LOG_SIZE>.*</LOG_SIZE>|<LOG_SIZE>$XML_LOG_SIZE</LOG_SIZE>|" $JMZ





#检查安装目录状态
if [[ -d "$dmbasedir" ]]; then
    # 检查目录是否非空
    if [ -n "$(ls -A "$dmbasedir" 2>/dev/null)" ]; then
        echo -e "\033[31m[错误]\033[0m $dmbasedir 目录不为空，退出安装" 
        exit 1
    else
        echo -e "\033[33m[信息]\033[0m $dmbasedir 目录存在但为空，判断正常！"
    fi
else
    echo -e "\033[33m[警告]\033[0m $dmbasedir 目录不存在，将创建"
    mkdir -p "$dmbasedir"
    chown "$dmuser:$dmgroup" "$dmbasedir"
fi

# 执行安装命令（添加安装路径参数）
install_cmd="$cdrom/DMInstall.bin -q $JMZ"
echo -e "\033[32m[执行]\033[0m 安装命令: su - $dmuser -c \"$install_cmd\""

# 捕获安装输出
install_output=$(su - "$dmuser" -c "$install_cmd" 2>&1)
install_status=$?

# 处理安装结果
if [ $install_status -eq 0 ]; then
    echo -e "\033[32m[成功]\033[0m 达梦数据库安装完成"
		# 执行root安装脚本（添加路径验证）
		root_script="$dmbasedir/script/root/root_installer.sh"
	if [[ -f "$root_script" ]]; then
		echo -e "\033[32m[执行]\033[0m 执行root安装脚本: $root_script"
		"$root_script"
        #顺便将DM注册成系统服务
        #注册达梦安装后的服务，服务名为：“DmService+$XML_DB_NAME”
        "$dmbasedir"/script/root/dm_service_installer.sh -t dmserver -dm_ini "$dmdatadir"/"$XML_DB_NAME"/dm.ini -p "$XML_DB_NAME"
        echo -e "\033[32m[成功]\033[0m 已将"$XML_DB_NAME"注册为系统服务"
        #设置达梦服务开机自启
        systemctl enable --now DmService"$XML_DB_NAME"
        echo -e "\033[32m[成功]\033[0m 已将DM"$XML_DB_NAME"服务启动并且设置为开机自启"
	else
		echo -e "\033[31m[错误]\033[0m 找不到root安装脚本: $root_script" 
		# 不退出，可能不是致命错误
	fi
else
    # 检查特定错误（不重新运行安装程序）
    if [[ $install_status -eq 1 ]] && [[ "$install_output" == *"至少2G的临时空间"* ]]; then
        echo -e "\033[33m[警告]\033[0m /tmp 空间不足，尝试使用备用临时目录"
        
        # 创建专用临时目录
        DM_TMP_DIR="/home/$dmuser/dm_install_tmp"
        mkdir -p "$DM_TMP_DIR"
        chown -R "$dmuser:$dmgroup" "$DM_TMP_DIR"
        chmod 700 "$DM_TMP_DIR"
        
        # 检查空间
        TMP_SPACE=$(df -m "$DM_TMP_DIR" | awk 'NR==2 {print $4}')
        if [ "$TMP_SPACE" -lt 2048 ]; then
            echo -e "\033[31m[错误]\033[0m 备用临时目录空间不足: ${TMP_SPACE}M < 2048M"
            exit 1
        fi
        
        # 使用新临时目录重新安装
        echo -e "\033[33m[信息]\033[0m 使用临时目录: $DM_TMP_DIR"
        export_cmd="export DM_INSTALL_TMPDIR='$DM_TMP_DIR'; $install_cmd"
        if su - "$dmuser" -c "$export_cmd"; then
            echo -e "\033[32m[成功]\033[0m 使用备用临时目录安装完成"
			# 执行root安装脚本（添加路径验证）
			root_script="$dmbasedir/script/root/root_installer.sh"
			if [[ -f "$root_script" ]]; then
				echo -e "\033[32m[执行]\033[0m root安装脚本: $root_script"
				"$root_script"
                #顺便将DM注册成系统服务
                #注册达梦安装后的服务，服务名为：“DmService+$XML_DB_NAME”
                "$dmbasedir"/script/root/dm_service_installer.sh -t dmserver -dm_ini "$dmdatadir"/"$XML_DB_NAME"/dm.ini -p "$XML_DB_NAME"
                echo -e "\033[32m[成功]\033[0m 已将"$XML_DB_NAME"注册为系统服务"
                #设置达梦服务开机自启
                systemctl enable --now DmService"$XML_DB_NAME"
                echo -e "\033[32m[成功]\033[0m 已将DM"$XML_DB_NAME"服务启动并且设置为开机自启"
			else
				echo -e "\033[31m[错误]\033[0m 找不到root安装脚本: $root_script" 
			# 不退出，可能不是致命错误
			fi	
            rm -rf "$DM_TMP_DIR"
        else
            echo -e "\033[31m[错误]\033[0m 使用备用临时目录安装失败"
            exit 1
        fi
    else
        echo -e "\033[31m[错误]\033[0m 安装失败，原因:"
        echo "$install_output"
        exit 1
    fi
fi